﻿// Tutorials.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "Log.h"
#define LOG(x) std::cout<< x << std::endl;

//默认创建value的变量
//void Increment(int value)
//{
//	value++;
//}

//指针写法
void Increment(int* value)
{
	(*value)++;
}

void Increment(int& value)
{
    value++; 
    //i++ 与 ++i单独使用时，值是一样
    //i= 5； a = i++； --> 输出的结果：5
    //i=5; a=++i;  --> 输出的结果：6
}


//int main()
//{
#pragma region if语句
    //int x = 6;
    ////创建bool接收，判断是否相等
    ////bool compareisonResult = x == 5;
    ////if(compareisonResult)
    ////    Log("Hello World!");

    //const char* ptr = "Hello World"; //指针可等于null 
    //if (ptr)
    //    Log(ptr);
    //else if (ptr == "Hello World")
    //    Log("Ptr is Hello");
    //else
    //    Log("Ptr is null");
#pragma endregion

#pragma region for循环

    //int i = 0;
    //bool condition = true;
    //for (; i < condition; )
    //{
    //    Log("Hello");
    //    i++;
    //    if (i > 5)   //输出结果： 只输出 Hello 一遍
    //        condition = false;
    //}
   
    //输出结果： 只输出 Hello 一遍
    //与教程结果相反，教程依然输出5次hello


	/*for (int i =0; i < 5; i++)
	{
		Log("Hello");
	}
	Log("=============");*/

#pragma endregion

#pragma region While

    /*int i = 0;
    while (i < 5)
    {
        Log("World");
        i++;
    }
    Log("============");*/

#pragma endregion

#pragma region do-while循环
    /*i = 0;
    do
    {  
        Log("Hello World");
        i++;
    } while (i < 5);

    Log("=============");*/
#pragma endregion

#pragma region continue

    /*for (int i = 0; i < 5; i++)
    {
        if(i %2 == 0)            
            continue;
        Log("Hello!");
        std::cout << i << std::endl;
    }

    Log("===============");*/
#pragma endregion

#pragma region break

    /*for (int i = 0; i < 5; i++)
    {
        if (i > 2)
            break;
        Log("Hello!!");
        std::cout << i << std::endl;
    }
    Log("================");*/
#pragma endregion

#pragma region return

    /*for (int i = 0; i < 5; i++)
    {
        if (i > 1)
            return 0;
        Log("Hello!!!");
        std::cout << i << std::endl;
    }
    Log("================");*/
#pragma endregion

#pragma region 指针

    //int var = 8;
    ////& 取址符， 与之配合为 var变量的地址,获取var变量的内存地址并赋值给ptr变量
    //void* ptr = &var;   
    // 
    //int var = 8;
    //int* ptr = &var; //获取的值依然是8

    //int var = 8;
    //double* ptr = (double*)&var; //获取的值依然是8

    //逆向引用指针，修改var的值
    //int var = 8;
    //int* ptr = &var;
    ////通过复制ptr指针对应的地址，逆向修改var地址的中值
    //*ptr = 10; 
    //LOG(var);  //输出结果为10

    //数组指针
    //开辟8个字节空间的char数组,并返回一个指向那块内存开始的指针即 char[0]的内存地址
    //char* buffer = new char[8]; 
    //// 接收一个指针，指针将会是内存块开始的指针char[0]
    ////第二个参数：取值为0
    ////第三个参数：大小为多少字节，假设为8
    ////新的关键字申请堆内存
    //memset(buffer,0,8);  //指针分配8个char 
    ////删除数据
    ////因是数组，使用delete[]删除
    //delete[] buffer;

    ////双指针    
    //char** ptr = &buffer;

#pragma endregion 指针

#pragma region 引用

    //int a = 5;
    ////&符号是变量声明的一部分，此处是类型的一部分
    ////创建一个ref的变量，此处只是一个引用 ，不是真正的变量，不实际存在
    ////编译后，不会存在ref变量，只有a变量
    //int& ref = a; //结果 5
    //ref = 2; // 给引用的变量a赋值  --> 2
    //LOG(ref);   // 结果  2
    //LOG(a);     // 结果  2    


    /*----------------------*/
    //int a = 5;
    //方法里创建一个新的value变量
    //Increment(a); 
    //LOG(a); //输出结果：5

    /*----------------------*/
    //Increment(&a);  //变量a应用了方法中value的地址,相当于c#中ref关键字作用
    //LOG(a); //输出结果：6

    /*----------------------*/
    //Increment(a);  //参数为引用参数，默认将地址传过去，进行自增
    //LOG(a);  //输出结果：6

    /*----------------------*/
    //int a = 5;
    //int b = 8;

    //int* ref = &a;  //ref结果: 5
    //*ref = 2;  // 逆向指针修改a的值， a = 2
    //LOG(ref);  //此处拿到的a的地址
    //LOG(a);    //输出结果：ａ＝２
    //ref = &b;  //引用b的地址
    //LOG(b);    //输出结果：b＝8
    //LOG(ref);  //此处拿到的b的地址
    //*ref = 1;  //逆向指针修改b的值， b = 1
    //LOG(a);    //输出结果：a＝2
    //LOG(b);    //输出结果：b=1


#pragma endregion 引用

//    std::cin.get();
//}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
